// import 'dart:io';

// import 'package:example/utils/collection_utils.dart';
// import 'package:flutter/material.dart';
// import 'package:get/get.dart';
// import 'package:video_player/video_player.dart';
// import 'package:zz_video_maker/zz_video_maker.dart';

// class VideoPlayerViewModel extends GetxController {
//   AllEditedData allEditedData;
//   final RxInt index;
//   int? lastIndex;

//   VideoPlayerViewModel(this.allEditedData, this.index);

//   var position = 0.0.obs;

//   // var isPlaying = true.obs;
//   bool isTrimmerEditing = false;

//   final Map<EditedMedia, VideoPlayerController> _controllers = {};

//   final Map<VideoPlayerController, VoidCallback> _listeners = {};

//   @override
//   void dispose() {
//     super.dispose();

//     removeAllController();
//   }

//   @override
//   void onClose() {
//     super.onClose();
//     removeAllController();
//   }

//   void removeAllController() {
//     for (var i = 0; i < _controllers.values.length; i++) {
//       var e = _controllers.values.elementAt(i);
//       if (_listeners[e] != null) {
//         e.removeListener(_listeners[e]!);
//         e.pause();
//         e.dispose();
//       }
//     }

//     _controllers.clear();
//     _listeners.clear();
//   }

//   @override
//   void onInit() {
//     super.onInit();

//     _initialized();
//     ever(index, (callback) {
//       if (lastIndex != null && lastIndex != index.value) {
//         removeController(lastIndex!);
//       }
//     });
//   }

//   Future<void> initialize() async {}

//   void updateAll() {
//     updatePlayer();
//     updateSticker();
//     updateText();
//     updatePlayerView();
//   }

//   void updateSticker() {
//     update(['sticker']);
//   }

//   void updateText() {
//     update(['text']);
//   }

//   void updateTrimmer(bool isTrimmerEditing, {bool isUpdatePlayer = false}) {
//     this.isTrimmerEditing = isTrimmerEditing;
//     update(['trimmer']);
//     if (isUpdatePlayer) {
//       updatePlayerView();
//     }
//   }

//   void updatePlayerView() {
//     update(['playerView']);
//   }

//   void updatePlayer() {
//     EditedMedia editedMedia = allEditedData.editedMediaList[index.value];
//     initController(index.value).then((value) {
//       controller(index.value).seekTo(
//           Duration(milliseconds: (editedMedia.startTime * 1000).toInt()));
//       update(['player']);
//     });
//   }

//   VoidCallback listenerSpawner(int index) {
//     EditedMedia editedMedia = allEditedData.editedMediaList[index];

//     return () {
//       var con = controller(index);
//       int start = (editedMedia.startTime * 1000).toInt();
//       // int end = ((editedMedia.duration + editedMedia.startTime) * 1000).toInt();
//       int duration = (editedMedia.duration * 1000).toInt();

//       int pos = con.value.position.inMilliseconds - start;
//       int dur = duration;

//       position.value = pos / duration;
//       print('index $index - pos $pos - start $start - dur $dur');
//       if (pos > dur - 1) {
//         if (index < allEditedData.editedMediaList.length - 1) {
//           this.index.value = index + 1;
//           playController(this.index.value);
//         } else {
//           con.pause();
//         }
//       } else if (pos < 0) {
//         con.seekTo(Duration(milliseconds: start));
//       }
//     };
//   }

//   VideoPlayerController controller(int index) {
//     var res = _controllers[allEditedData.editedMediaList.elementAt(index)];
//     if (res == null) {
//       initController(index);
//       res = _controllers[allEditedData.editedMediaList.elementAt(index)];
//     }
//     return res!;
//   }

//   Future<void> initController(int index, {bool isUpdatePlayer = false}) async {
//     if (checkIndexError(index)) {
//       return;
//     }

//     var data = allEditedData.editedMediaList.elementAt(index);
//     var oldCon = _controllers[data];
//     if (oldCon != null) {
//       removeController(index);
//     }
//     VideoPlayerController controller;
//     VideoPlayerOptions options = VideoPlayerOptions();

//     if (data.mediaData.isVideo) {
//       controller = VideoPlayerController.file(File(data.mediaData.absolutePath),
//           videoPlayerOptions: options);
//     } else {
//       controller = VideoPlayerController.file(
//           File(data.mediaData.imageVideoPath!),
//           videoPlayerOptions: options);
//     }

//     _controllers[data] = controller;

//     await controller.initialize().then((value) {
//       if (isUpdatePlayer) {
//         updatePlayer();
//       }
//       controller
//           .seekTo(Duration(milliseconds: (data.startTime * 1000).toInt()));
//     });
//   }

//   void removeController(int index) {
//     if (checkIndexError(index)) {
//       return;
//     }
//     EditedMedia editedMedia = allEditedData.editedMediaList[index];

//     var con = controller(index);
//     // con.pause();
//     con.dispose();
//     _controllers.remove(editedMedia);
//     var res = _listeners.remove(con);
//     if (res != null) {
//       con.removeListener(res);
//     }
//     // con.seekTo(Duration(milliseconds: (e ditedMedia.startTime * 1000).toInt()));
//   }

//   // void stopController(int index) {
//   //   if (checkIndexError(index)) {
//   //     return;
//   //   }

//   //   EditedMedia editedMedia = allEditedData.editedMediaList[index];
//   //   var con = controller(index);
//   //   con.removeListener(_listeners[con]!);
//   //   con.pause();
//   //   con.seekTo(Duration(milliseconds: (editedMedia.startTime * 1000).toInt()));
//   // }

//   bool get isPlaying => controller(index.value).value.isPlaying;

//   void pause() {
//     controller(index.value).pause();
//   }

//   void play() {
//     var con = controller(index.value);
//     if (!_listeners.keys.contains(con)) {
//       var spawner = listenerSpawner(index.value);
//       con.addListener(spawner);
//       _listeners[con] = spawner;
//     }
//     con.play();
//     lastIndex = index.value;
//   }

//   void playController(int index) async {
//     if (checkIndexError(index)) {
//       return;
//     }
//     if (lastIndex != null && lastIndex != index) {
//       removeController(lastIndex!);
//     }
//     lastIndex = index;

//     EditedMedia editedMedia = allEditedData.editedMediaList[index];
//     var con = controller(index);
//     if (!_listeners.keys.contains(con)) {
//       var spawner = listenerSpawner(index);
//       con.addListener(spawner);
//       _listeners[con] = spawner;
//     }

//     initController(index - 1);
//     initController(index + 1);

//     // for (var (element, index)
//     //     in _controllers.values.toList().mapIndex((e, index) => (e, index))) {
//     //   element.removeListener(_listeners[index]);
//     // }

//     // var maxPosition =
//     //     ((editedMedia.duration + editedMedia.startTime) * 1000).toInt() - 1;
//     // var curPosition = controller(index).value.position.inMilliseconds;
//     con.seekTo(Duration(milliseconds: (editedMedia.startTime * 1000).toInt()));
//     await con.play();

//     // setState(() {});
//   }

//   // void playVideo(int playIndex) {
//   //   if (checkIndexError(playIndex)) {
//   //     return;
//   //   }

//   //   if (playIndex == index.value) {
//   //     return;
//   //   } else if (playIndex == index.value - 1) {
//   //     previousVideo();
//   //     return;
//   //   } else if (playIndex == index.value + 1) {
//   //     nextVideo();
//   //     return;
//   //   }

//   //   if (lock.value) {
//   //     return;
//   //   }
//   //   lock.value = true;

//   //   stopController(index.value);

//   //   removeController(index.value + 1);
//   //   removeController(index.value - 1);

//   //   playController(playIndex);
//   //   index.value = playIndex;

//   //   initController(index.value - 1).whenComplete(() => lock.value = false);
//   //   initController(index.value + 1).whenComplete(() => lock.value = false);
//   // }

//   // void previousVideo() {
//   //   if (lock.value || index.value == 0) {
//   //     return;
//   //   }
//   //   lock.value = true;

//   //   stopController(index.value);

//   //   if (index.value + 1 < allEditedData.editedMediaList.length) {
//   //     removeController(index.value + 1);
//   //   }

//   //   playController(--index.value);

//   //   if (index.value == 0) {
//   //     lock.value = false;
//   //   } else {
//   //     initController(index.value - 1).whenComplete(() => lock.value = false);
//   //   }
//   // }

//   // void nextVideo() async {
//   //   if (lock.value || index.value == allEditedData.editedMediaList.length - 1) {
//   //     return;
//   //   }
//   //   lock.value = true;

//   //   stopController(index.value);

//   //   if (index.value - 1 >= 0) {
//   //     removeController(index.value - 1);
//   //   }

//   //   playController(++index.value);

//   //   if (index.value == allEditedData.editedMediaList.length - 1) {
//   //     lock.value = false;
//   //   } else {
//   //     initController(index.value + 1).whenComplete(() => lock.value = false);
//   //   }
//   // }

//   _initialized() async {
//     removeAllController();

//     if (allEditedData.editedMediaList.isNotEmpty) {
//       await initController(0, isUpdatePlayer: true);
//     }

//     if (allEditedData.editedMediaList.length > 1) {
//       await initController(1);
//     }
//   }

//   bool checkIndexError(index) {
//     if (index < 0 || index > allEditedData.editedMediaList.length - 1) {
//       return true;
//     }
//     return false;
//   }
// }
